function EventEmit() {

}

EventEmit.prototype.on = function (eventName, callback) {
    if (!this._emit) {
        this._emit = {}
    }
    if (this._emit[eventName]) {
        this._emit[eventName].push(callback)
    } else {
        this._emit[eventName] = [callback]
    }
}
EventEmit.prototype.emit = function (eventName, ...args) {
    if (this._emit[eventName]) {
        this._emit[eventName].forEach(fn => fn(...args))
    }
}
EventEmit.prototype.off = function (eventName, callback) {
    if (this._emit[eventName]) {
        this._emit[eventName] = this._emit[eventName].filter(fn => fn !== callback && fn.l !== callback)
        // 这里的无符号右移我们说明一下
        // indexOf() 如果查找到会返回数组的序号，如果查找不到会返回 -1
        // splice 方法在第一个参数是-1的情况下 会把数组的最后一项干掉
        // 加入无符号右移之后，-1 >>> 0 => 4294967295,这是一个很大的值，对数组没有影响，既不删除任何数组项。
        // 这个没有实现onece???
        // this._emit[eventName].splice(this._emit[eventName].indexOf(callback) >>> 0, 1);
    }
}
EventEmit.prototype.once = function (eventName, callback) {
    // this.on(eventName, callback)
    // this.off(eventName, callback)
    // 面向切面编程,AOP
    const one = _ => {
        callback()
        this.off(eventName,one)
    }
    one.l = callback
    this.on(eventName,one)
}

module.exports = EventEmit;